home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / DB / QueryTool / EasyJoin.php next >
PHP Script  |  2004-10-01  |  6KB  |  136 lines

  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PHP Version 4                                                        |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1997-2003 The PHP Group                                |
  6. // +----------------------------------------------------------------------+
  7. // | This source file is subject to version 2.02 of the PHP license,      |
  8. // | that is bundled with this package in the file LICENSE, and is        |
  9. // | available at through the world-wide-web at                           |
  10. // | http://www.php.net/license/2_02.txt.                                 |
  11. // | If you did not receive a copy of the PHP license and are unable to   |
  12. // | obtain it through the world-wide-web, please send a note to          |
  13. // | license@php.net so we can mail you a copy immediately.               |
  14. // +----------------------------------------------------------------------+
  15. // | Author:  Wolfram Kriesing, Paolo Panto, vision:produktion <wk@visionp.de>
  16. // +----------------------------------------------------------------------+
  17. //
  18. // $Id: EasyJoin.php,v 1.6 2004/04/06 12:25:42 quipo Exp $
  19. //
  20. /**
  21.  * Load DB_QueryTool_Query class
  22.  */
  23. require_once 'DB/QueryTool/Query.php';
  24.  
  25. /**
  26.  *
  27.  * @package    DB_QueryTool
  28.  * @version    2002/09/03
  29.  * @access     public
  30.  * @author     Wolfram Kriesing <wolfram@kriesing.de>
  31.  */
  32. class DB_QueryTool_EasyJoin extends DB_QueryTool_Query
  33. {
  34.     // {{{ class vars
  35.  
  36.     /**
  37.      * this is the regular expression that shall be used to find a table's shortName
  38.      * in a column name, the string found by using this regular expression will be removed
  39.      * from the column name and it will be checked if it is a table name
  40.      * i.e. the default '/_id$/' would find the table name 'user' from the column name 'user_id'
  41.      *
  42.      * @var string regexp
  43.      */
  44.     var $_tableNamePreg = '/_id$/';
  45.  
  46.     /**
  47.      * this is to find the column name that is refered by it, so the default find
  48.      * from 'user_id' the column 'id' which will be used to refer to the 'user' table
  49.      *
  50.      * @var string regexp
  51.      */
  52.     var $_columnNamePreg = '/^.*_/';
  53.  
  54.     // }}}
  55.     // {{{ __construct()
  56.  
  57.     /**
  58.      * call parent constructor
  59.      * @param mixed $dsn DSN string, DSN array or DB object
  60.      * @param array $options
  61.      */
  62.     function __construct($dsn=false, $options=array())
  63.     {
  64.         parent::DB_QueryTool_Query($dsn, $options);
  65.     }
  66.  
  67.     // }}}
  68.     // {{{ autoJoin()
  69.  
  70.     /**
  71.      * join the tables given, using the column names, to find out how to join the tables
  72.      * this is, if table1 has a column names table2_id this method will join
  73.      * WHERE table1.table2_id=table2.id
  74.      * all joins made here are only concatenated via AND
  75.      */
  76.     function autoJoin($tables)
  77.     {
  78. // FIXXME if $tables is empty autoJoin all available tables that have a relation to $this->table, starting to search in $this->table
  79.         settype($tables, 'array');
  80.         // add this->table to the tables array, so we go thru the current table first
  81.         $tables = array_merge(array($this->table), $tables);
  82.  
  83.         $shortNameIndexed = $this->getTableSpec(true, $tables);
  84.         $nameIndexed = $this->getTableSpec(false, $tables);
  85.  
  86. //print_r($shortNameIndexed);
  87. //print_r($tables);        print '<br><br>';
  88.         if (sizeof($shortNameIndexed) != sizeof($tables)) {
  89.             $this->_errorLog("autoJoin-ERROR: not all the tables are in the tableSpec!<br />");
  90.         }
  91.  
  92.         $joinTables = array();
  93.         $joinConditions = array();
  94.         foreach ($tables as $aTable) {   // go through $this->table and all the given tables
  95.             if ($metadata = $this->metadata($aTable))
  96.             foreach ($metadata as $aCol => $x) {   // go through each row to check which might be related to $aTable
  97.                 $possibleTableShortName = preg_replace($this->_tableNamePreg, '' , $aCol);
  98.                 $possibleColumnName = preg_replace($this->_columnNamePreg, '' , $aCol);
  99. //print "$aTable.$aCol .... possibleTableShortName=$possibleTableShortName .... possibleColumnName=$possibleColumnName<br>";
  100.                 if (isset($shortNameIndexed[$possibleTableShortName])) {
  101.                     // are the tables given in the tableSpec?
  102.                     if (!$shortNameIndexed[$possibleTableShortName]['name'] ||
  103.                         !$nameIndexed[$aTable]['name']) {
  104.                         // its an error of the developer, so log the error, dont show it to the end user
  105.                         $this->_errorLog("autoJoin-ERROR: '$aTable' is not given in the tableSpec!<br />");
  106.                     } else {
  107.                         // do only join different table.col combination,
  108.                         // we shoul not join stuff like 'question.question=question.question' this would be quite stupid, but it used to be :-(
  109.                         if ($shortNameIndexed[$possibleTableShortName]['name'].$possibleColumnName != $aTable.$aCol) {
  110.                             $joinTables[] = $nameIndexed[$aTable]['name'];
  111.                             $joinTables[] = $shortNameIndexed[$possibleTableShortName]['name'];
  112.                             $joinConditions[] = $shortNameIndexed[$possibleTableShortName]['name'].".$possibleColumnName=$aTable.$aCol";
  113.                         }
  114.                     }
  115.                 }
  116.             }
  117.         }
  118.  
  119.         if (sizeof($joinTables) && sizeof($joinConditions)) {
  120.             $joinTables = array_unique($joinTables);
  121.             foreach ($joinTables as $key => $val) {
  122.                 if ($val == $this->table) {
  123.                     unset($joinTables[$key]);
  124.                 }
  125.             }
  126. //FIXXME set tables only when they are not already in the join!!!!!
  127.  
  128. //print_r($joinTables); echo '$this->addJoin('.implode(' AND ',$joinConditions).');<br />';
  129.             $this->addJoin($joinTables, implode(' AND ', $joinConditions));
  130.         }
  131. //print '<br /><br /><br />';
  132.     }
  133.  
  134.     // }}}
  135. }
  136. ?>